 /*********************************/
 /** 	  common-fn 公共函数	 **/
 /*********************************/

/**
 * 加载layui,自定义模块
 */
layui.extend({
	steps : '{/}'+path+'/resource/layui/extend/steps/steps' // {/}的意思即代表采用自有路径，即不跟随 base 路径
})

 /*********************************/
 /** 		  公共常量			 	 **/
 /*********************************/
const form = layui.form;
const table = layui.table;
const layer = layui.layer;
const laydate = layui.laydate;

/*********************************/
/** 		  公共变量			**/
/*********************************/
var exportDate = new Date();//获取系统当前时间
var layerIndex;//弹窗索引
var cTable//当前表格

$(function(){
	cTable = $("#bootstrap_table");//当前表格
	
	//条件查询
	form.on('submit(submitQueryForm)', function(data){
		data.field.offset = 1;
		data.field.limit = 10;
		cTable.bootstrapTable(
			'refresh',{
				query: data.field
			}
		);
		return false;
    });
})

/**
 * 扩展校验规则
 */
form.verify({
	
	//value：表单的值item：表单的DOM对象
	enterpriseName: function(value, item){ 
		//公司名new RegExp(regExpStr)
		if(value.length != 0 || value != ""){
    	    if(! new RegExp("^[a-zA-Z0-9_\u4e00-\u9fa5\\s·]+$").test(value)){
    	    	
    	      return "公司名称格式不正确!";
    	    }
    	}
    },
    peopleName: function(value, item){ 
    	//人名
    	if(value.length != 0 || value != ""){
    	    if(! new RegExp(/^[\u4e00-\u9fa5]{2,}$/).test(value)){
    	    	
    	      return "输入的格式不正确!";
    	    }
    	}
    },
    birthday: function(value,item){
    	//生日
    	if(value.length != 0 || value != ""){
    	    if(! new RegExp(/^\d{4}(\-)\d{1,2}\1\d{1,2}$/).test(value)){
    	    	 			
    	      return "生日格式不正确!-请使用这类格式:2018-05-04";
    	    }
    	}
    },
    tel: function(value,item){
    	//电话
    	if(value.length != 0 || value != ""){
    	    if(! new RegExp(/^(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}$/).test(value)){
    	    	
    	      return "电话格式不正确!-请使用这类格式:0551-5555555";
    	    }
    	}
    },
    postcode: function(value,item){
    	//邮政编码
    	if(value.length != 0 || value != ""){
    	    if(! new RegExp(/^[1-9][0-9]{5}$/).test(value)){
    	    	
    	      return "邮政编码格式不正确!";
    	    }
    	}
    },
    fax: function(value,item){
    	//传真
    	if(value.length != 0 || value != ""){
    	    if(! new RegExp(/^(\d{3,4}-)?\d{7,8}$/).test(value)){
    	    	
    	      return "传真格式不正确!";
    	    }
    	}
    },
    qq: function(value,item){
    	//QQ
    	if(value.length != 0 || value != ""){
    	    if(! new RegExp(/[1-9]([0-9]{5,11})/).test(value)){
    	    	
    	      return "QQ号码格式不正确!";
    	    }
    	}
    },
    wechat: function(value,item){
    	//微信
    	if(value.length != 0 || value != ""){
    	    if(! new RegExp(/^[a-zA-Z\d_]{5,}$/).test(value)){
    	    	
    	      return "微信号格式不正确!";
    	    }
    	}
    },
    myemail: function(value,item){
    	//邮箱
    	if(value.length != 0 || value != ""){
    	    if(! new RegExp(/\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}/g).test(value)){
    	    	
    	      return "邮箱格式不正确!";
    	    }
    	}
    },
    cnw: function(value,item){
    	//中文(chinese) 数字(number)字母(word)
    	if(value.length != 0 || value != ""){
    	    if(! new RegExp(/^[0-9a-zA-Z\u0391-\uFFE5]+$/).test(value)){
    	    	
    	      return "不允许有特殊符号!";
    	    }
    	}
    },
    bankCard: function(value,item){
    	//银行卡号
    	if(value.length != 0 || value != ""){
    	    if(! new RegExp(/^([1-9]{1})(\d{14}|\d{18})$/).test(value)){
    	    	
    	      return "银行卡号不正确!";
    	    }
    	}
    },
    mydate: function(value,item){
    	//日期
    	if(value.length != 0 || value != ""){
    	    if(! new RegExp(/\d{4}(\-|\/|.)\d{1,2}\1\d{1,2}/).test(value)){
    	    	
    	      return "日期格式不正确";
    	    }
    	}
    },
    intNumber: function(value,item){
    	//整数
    	if(value.length != 0 || value != ""){
    	    if(! new RegExp(/-?[0-9]\d*/).test(value)){
    	    	
    	      return "必须是整数";
    	    }
    	}
    },
    chineseStr: function(value,item){
    	//中文字符
    	if(value.length != 0 || value != ""){
    	    if(! new RegExp(/[\u4e00-\u9fa5]/).test(value)){
    	    	
    	      return "只能填写中文字符";
    	    }
    	}
    },
    idCard: function(value,item){
    	//身份证
	    if(value.length != 0 || value != ""){
		    if(! new RegExp(/\d{17}[\d|x]|\d{15}/).test(value)){
		    	
		      return "只能填写中文字符";
		    }
		}
    }
});

/**
 * 简单包装一下layui的alert方法
 * @param text
 * 			需要提示的文本
 * @param autoClose
 * 			是否在点击确定后自动关闭父窗口
 * @param iconNum
 * 			弹窗后的图标
 * @param refreshTable
 * 			刷新父窗口的bootstrap表格
 */
function fixedAlert(text,iconNum,autoClose,refreshTable){
	layer.alert(text,{
	    title:"提示信息"
	    ,skin: 'layui-layer-lan'
	    ,closeBtn: 0
	    ,anim: 0 //动画类型
	    ,icon: iconNum
	},function(index){
		//是否关闭父窗口
		if(autoClose){
			 var parentIndex = parent.layer.getFrameIndex(window.name);
			 parent.layer.close(parentIndex);
		}
		if(refreshTable){
			/*var table = typeof(cTable) == 'undefined'?parent.cTable:cTable;*/
			if(typeof(cTable) != 'undefined'){
				cTable.bootstrapTable('refresh');
			}
			if(typeof(parent.cTable) != 'undefined'){
				parent.cTable.bootstrapTable('refresh');
			}
		}
		layer.close(index);
    });
	
	this.onkeydown = function(e){   
	    var ev =parent. document.all ? window.event : e;  
	    if(ev.keyCode==13) { 
	    	 var parentIndex = parent.layer.getFrameIndex(window.name);
			 parent.layer.close(parentIndex);
	    }
	} 
}

/**
 * 渲染表格
 * @param tableElement
 * 			表格元素DOM对象
 * @param data
 * 			属性值
 */
var renderTable = function (tableElement,data){
    var oButtonInit = new ButtonInit();		//初始化Button的点击事件
    oButtonInit.Init();
    
    var oTable = new TableInit();;
    oTable.Init(tableElement,data);
};

/**
 * 初始化页面上面的按钮事件
 */
var ButtonInit = function () {
    var oInit = new Object();
    var postdata = {};
    oInit.Init = function (){};
    return oInit;
};

/**
 * 表格数据初始化
 */
var TableInit = function () {								
    var oTableInit = new Object();
    
    oTableInit.Init = function (tableElement,data) {
    	tableElement.bootstrapTable({
    				url: data.url?data.url:'',
					method: data.method?data.method:'POST',                     				//请求方式（*）
					dataType: data.dataType?data.dataType:"json",								//数据格式
					contentType: data.contentType?data.contentType:"application/x-www-form-urlencoded;charset='UTF-8'", //加上这个才可以接收到值
					toolbar: data.toolbar?data.toolbar:'#toolbar',               		 		//工具按钮用哪个容器
					striped: data.striped?data.striped:true,                      				//是否显示行间隔色
					cache: data.cache?data.cache:false,                       					//是否使用缓存，默认为true，所以一般情况下需要设置一下这个属性（*）
					pagination: data.pagination?data.pagination:true,                   		//是否显示分页（*）
					sortable: data.sortable?data.sortable:false,                    	 		//是否启用排序
					sortOrder: data.sortOrder?data.sortOrder:"asc",                 			//排序方式
					sidePagination: data.sidePagination?data.sidePagination:"server",           //分页方式：client客户端分页，server服务端分页（*）
					pageNumber:data.pageNumber?data.pageNumber:1,                       		//初始化加载第一页，默认第一页
					pageSize: data.pageSize?data.pageSize:10,                       			//每页的记录行数（*）
					pageList: data.pageList?data.pageList:[10, 25, 50, 100],        			//可供选择的每页的行数（*）
					search: data.search?data.search:false,                       				//是否显示表格搜索，此搜索是客户端搜索，不会进服务端，所以，个人感觉意义不大
					strictSearch: data.strictSearch?data.strictSearch:true,
					height: data.height?data.height:undefined,
					showColumns: data.showColumns?data.showColumns:true,                  		//是否显示所有的列
					showRefresh: data.showRefresh?data.showRefresh:true,                  		//是否显示刷新按钮
					minimumCountColumns: data.minimumCountColumns?data.minimumCountColumns:2,   //最少允许的列数
					clickToSelect: data.clickToSelect?data.clickToSelect:true,                	//是否启用点击选中行
					uniqueId: data.uniqueId?data.uniqueId:"ID",                     			//每一行的唯一标识，一般为主键列
					showToggle:data.showToggle?data.showToggle:true,                    		//是否显示详细视图和列表视图的切换按钮
					cardView: data.cardView?data.cardView:false,                    			//是否显示详细视图
					detailView: data.detailView?data.detailView:false,                  		//是否显示父子表
					pagination:data.pagination?data.pagination:true,
					showExport: data.showExport?data.showExport:true, 							//是否显示导出
					showFooter: data.showFooter?data.showFooter:false,							//显示页脚
					exportDataType:data.exportDataType?data.exportDataType:"basic", 			//basic', 'all', 'selected'.
					Icons:data.Icons?data.Icons:'glyphicon-export',
					queryParams: function (params) {
						//得到查询的参数
						var temp;
						if(typeof(data.wrapParams) != 'undefined'){
							temp = data.wrapParams;
						}else{
							temp = {											//这里的键的名字和控制器的变量名必须一直，这边改动，控制器也需要改成一样的
				    	    	limit: params.limit,   							//页面大小
				    	    	offset: (params.offset / params.limit) + 1		//页码
				            };
						}
			            return temp;
			        },
					exportOptions:data.exportOptions?data.exportOptions:{  
						   fileName: '未命名',
						   worksheetName: 'sheet1', 											//表格工作区名称  
						   tableName: '未命名',
						   ignoreColumn: [0,1],
						   unaffectedColumn:0
					},
					columns: data.columns?data.columns:[]
				});
    }
     return oTableInit;
};

/**
 * 设置Bootstrap-table 的搜索框中的文本
 * @param text 要设置的文本
 */
function setSearchPlaceholder(text){
	$("input[class='form-control']").attr("placeholder",text);
}


/**
 * 删除选中的记录行
 * @param  idField
 * 			  id行 对应的 field 字段
 * @param  url
 * 			  请求的接口
 */
function requestRemoveData (idField,url){
  //用来存储选中行的id号
  var ids = ''; 
  //获取所有被选中的记录
  var rows = cTable.bootstrapTable('getSelections'); 
	if (rows.length== 0) { //判断是否有选中行
		fixedAlert('最少选中一条记录!',0);
	}else{
		for (var i = 0; i < rows.length; i++) { //遍历拼接获取到的id号码
		  ids += rows[i][idField] + ","; 
		}
		ids = ids.substring(0, ids.length - 1);
		var layerIndex;
		$.ajax({
		   type: 'DELETE',
		   url: path+url+"/"+ids,
		   async: false,
		   contentType: "application/x-www-form-urlencoded;charset='UTF-8'", 
		   beforeSend: function () {
			   layerIndex = layer.load(2);
           },
           statusCode: {
			   200: function() {
				   fixedAlert('删除成功!',1,true,true); 
			   },
			   400: function() {
				   fixedAlert('删除失败!',2,false);
			   },
			   500: function() {
				   fixedAlert('服务端繁忙!',2,false);
			   }
		   },
	       complete: function(){
	    	   layer.close(layerIndex);
	       }
		})
	}
}

/**
 * 添加数据,和submit必须是submiForm
 * 必须引入了layui.js
 * @param  url
 * 			  地址接口
 */
function requestAddData(url,successText,failText){
  form.on('submit(submitForm)',function(data){
	  $.ajax({
		   type: 'POST',
		   url: path+url,
		   async: false,
		   data: data.field,
		   contentType: "application/x-www-form-urlencoded;charset='UTF-8'", 
		   beforeSend: function () {
			   layerIndex = layer.load(2);
           },
		   error: function(XMLHttpRequest, textStatus, errorThrown) {
			   fixedAlert(failText!='undefined'&&''?failText:'添加失败!',2);
		   },
	       success: function(msg){
	    	   fixedAlert(successText!='undefined'&&''?successText:'添加成功!',1,true,true);
		   },
		   complete: function(){
			   layer.close(layerIndex);
		   }
       })
       return false
  	})
}

/**
 * 更新 修改 数据,和submit必须是submiForm
 * 必须引入了layui.js
 * @param  url
 * 			  地址接口
 */
function requestUpdateData(url,successText,failText){
  form.on('submit(submitForm)',function(data){
	  var layerIndex;
	  $.ajax({
		   type: 'PUT',
		   url: path+url,
		   data:data.field,
		   contentType: "application/x-www-form-urlencoded;charset='UTF-8'", 
		   beforeSend: function () {
			   layerIndex = layer.load(2);
           },
		   error: function(XMLHttpRequest, textStatus, errorThrown) {
			   fixedAlert(failText!='undefined'&&''?failText:'修改失败!',2);
		   },
	       success: function(msg){
	    	   fixedAlert(successText!='undefined'&&''?successText:'修改成功!',1,true,true);
		   },
		   complete: function(){
			   layer.close(layerIndex);
		   }
       })
       return false
  	})
}

/**
 * 通用 生成select的option选项
 * 注意 JSON格式 {key:<option>的value属性值,value:<option>的显示文本}
 * @param selectObj 頁面當中的select元素对象
 * @param selectedValue 默认选中的select的值
 * @param url 接口的地址,不需要写前缀
 */
function renderSelectOption(_ele,_url,_flag){
	 $.ajax({
	   type: 'GET',
	   url: path+_url,
	   contentType: "application/x-www-form-urlencoded;charset='UTF-8'", 
	   statusCode : {
		   200 : function(msg){
			   //用来存储每个key的数组
			   var keys = new Array();
			   //用来存储每个value的数组
			   var values = new Array();
			   //循环判断 格式化 值
			   for(var index = 0;index<msg.length;index++){
				   for(key in msg[index]){
					   //key的值必须有Id字符串
					   if(key.indexOf("Id")!=-1||key.indexOf("id")!=-1||key.indexOf("ID")!=-1){
						   keys.push(msg[index][key]);
					   }else if(key.indexOf('style')!=-1||key.indexOf('Style')!=-1||key.indexOf('STYLE')!=-1){
						   break;
					   }else{//不带Id字符窜的就为value的值
						   values.push(msg[index][key]);
					   }
				   }
			   }
			   //这里循环遍历一个数字即可,应为都是一样长度的
			   for(var index = 0;index<keys.length;index++){
				   if(_flag==keys[index]){
					   _ele.append("<option selected value='"+keys[index]+"'>"+values[index]+"</option>")
				   }else{
					   _ele.append("<option value='"+keys[index]+"'>"+values[index]+"</option>")
				   }
			   }
			   form.render('select'); //刷新select选择框渲染
		   },
		   404 : function(msg){
			   fixedAlert("未找到相关数据:"+_url,3,false);
		   },
		   500 : function(msg){
			   fixedAlert("服务端繁忙:"+_url,0,false);
		   }
	   }
	 });
 }

/**
 * 生成<option>
 * 
 * @param _ele
 * 			<select>元素对象
 * @param _data
 * 			数据
 * @param _flag
 * 			需要添加selected属性的<option>的value
 */
function renderSelectedOption(_ele,_data,_flag){
	//将数据打包成两个数组
	var keyArray = new Array();
	var valueArray = new Array();
	for(index in _data){
		for(key in _data[index]){
			 if(key.indexOf("Id")!=-1||key.indexOf("id")!=-1||key.indexOf("ID")!=-1){
				 keyArray.push(_data[index][key]);
			 }else{
				 valueArray.push(_data[index][key]);
			 }
		}
    }
	for(var item = 0;item<keyArray.length;item++){
		if(_flag == valueArray[item] || _flag == keyArray[item]){
			_ele.append("<option selected value='"+keyArray[item]+"'>"+valueArray[item]+"</option>");
		}else {
			_ele.append("<option value='"+keyArray[item]+"'>"+valueArray[item]+"</option>");
		}
	}
	form.render();
}

/**
 * 根据key value 属性生成select
 * @param _ele
 * 			<select>元素对象
 * @param _data
 * 			[{key:xxx,value:xxx},
 * 			 {key:xxx,value:xxx},
 * 			 {key:xxx,value:xxx}]
 * @param _flag
 * 			需要添加selected属性的<option>的value
 */
function renderSelectOptionByKeyValue(_ele,_data,_flag){
	for(var item = 0; item < _data.length; item++){
		var currentOption = _data[item];
		if(currentOption.key == _flag){
			_ele.append("<option selected value="+currentOption.key+">"+currentOption.value+"</option>");
		}else{
			_ele.append("<option value="+currentOption.key+">"+currentOption.value+"</option>");
		}
	}
}

/**
 * 请求后台数据<select>
 * @param 请求的地址
 * @returns
 */
function requestData(url){
	 var temp;
	 $.ajax({
		   type: 'GET',
		   async: false,
		   url: url,
		   contentType: "application/x-www-form-urlencoded;charset='UTF-8'", 
		   success: function(msg){
			   temp = msg;
		   },
		   error: function(){
			   temp = "-1"; 
		   }
	 });
	 return temp;
}

/**
 * 生成条件查询面板
 * 
 * name: input组件的name属性
 * type: 当前组件的类型
 * title: 文本标题,显示出来的文本
 * verify: input组件的校验规则
 * option: 如果当前组件是select着需要使用option参数
 * 
 * 
 * var param = [{
 *			text: "标题",
 *			name: "inputName属性",
 *			verify: "layui的校验规则",
 *			type: "控件类型"
 *		},{
 *			text: "标题",
 *			name: "inputName属性",
 *			type: "控件类型",
 *			option: 
 *				[{
 *					key: "1", key对应option的value
 *					value: "cccc" value对应option标签的显示文本
 *				}]
 *		}];
 * @param panelEle 显示节点
 * @param paramObj 数据
 * @returns
 */
function createQueryPanel(paramObj,panelEle){
	
	var panel = panelEle;
	
	if(typeof(panelEle) == 'undefined'){
		panel = $("#queryPanel");
	}
	
	var panel_heading =
		'<div class="panel panel-default">' +
			'<form class="layui-form">' +
				'<div class="panel-heading">' +
					'<div class="btn-group">' +
						'<button id="query_btn" type="button" class="btn btn-default" lay-submit lay-filter="submitQueryForm">' +
							'<span class="glyphicon glyphicon-search icon-btn-style" title="条件查询"></span>' +
						'</button>' +
						'<button id="clean_btn" type="reset" class="btn btn-default">' +
							'<i class="glyphicon glyphicon-trash icon-btn-style" title="清空重填"></i>' +
						'</button>' +
					'</div>' +
				'</div>';
	
	var panel_body = '<div class="panel-body"><div class="layui-row">';
	
	for(var i = 0; i <paramObj.length;i++){
		
		panel_body +=
			'<div class="layui-col-md4">' +
				'<div class="layui-row">' +
					'<div class="layui-col-md3 layui-col-sm3 layui-col-xs3">' +
						'<label class="layui-form-label">'+paramObj[i].text+'</label>' +
					'</div>';
		
		 if(paramObj[i].type == "text"){
			panel_body +=
					'<div class="layui-col-md9 layui-col-sm9 layui-col-xs9">' +
						'<input type="text" class="layui-input" lay-verify="'+paramObj[i].verify+'" name="'+paramObj[i].name+'" placeholder="'+paramObj[i].text+'" autocomplete="off"/>' +
					'</div>' +
				'</div>' +
			'</div>';
			
		}else if(paramObj[i].type == "select"){
			
			var option = paramObj[i].option;
			
			panel_body +=
				'<div class="layui-col-md9 layui-col-sm9 layui-col-xs9">' +
					'<select name="'+paramObj[i].name+'">' +
						'<option value=""></option>';
			
			for(var x = 0;x < option.length; x++){
				
				panel_body += '<option value="'+option[x].key+'">'+option[x].value+'</option>'
			}
			
			panel_body += '</select></div></div></div>';
		}
	}
	
	panel_body +='</form></div>';
	panel.append(panel_heading += panel_body);
};

/**
 * 将对象的参数转换成 i:{key:xxx,value:xxx} 的格式,只能用户只具备两个属性的对象
 */
function toKeyValueMap(Obj){
   var map = [];
   for(var item = 0; item < Obj.length;item++){
	   var keyFlag = true;
	   var tempMapObj = {};
	   for(key in Obj[item]){
		   var crrentKeyValue = Obj[item][key];
		   if(keyFlag){
			   tempMapObj.key = crrentKeyValue;
			   keyFlag = false;
		   }else{
			   tempMapObj.value = crrentKeyValue;
			   map.push(tempMapObj);
			   keyFlag = true;
		   }
	   }
   }
   return map;
}

/**
 * 已Key的值为存储的元素的Key
 * 这两个key的值是相同的
 * [key:{key:value}]
 */
function elementKeyMap(Obj){
	var map = {};
	var formatted = toKeyValueMap(Obj);
	for(var item = 0; item < formatted.length; item++){
		var key = formatted[item].key;
		map[key] = formatted[item];
	}
	return map;
}

/**
 * [
 * 		0:{key:value},
 * 		1:{key:value},
 * 		2:{key:value}
 * ]
 **/
function ObjectConvertArray(Obj){
	var map = [];
	for(key in Obj){
		map.push(Obj[key]);
	}
	return map;
}

/**
 * 打开窗口就是弹出用来添加或者修改的窗口
 * 这里传递的是一个对象,对象需要包含下面的属性
 * @param title
 * 			窗口标题
 * @param url
 * 			打开的文件路径
 * @param full
 * 			是否全屏
 * @param iframeAuto
 * 			自适应高宽
 * @param width
 * 			宽度,默认为25%
 * @param height
 * 			高度,默认为75%
 * @param isUpdate
 * 			是否是更新操作
 */
function openOperateWindow(Obj){
	
	//判断是否为修改的功能
	if(Obj.isUpdate == true && cTable.bootstrapTable('getSelections').length != 1){
		fixedAlert("请勾选需要修改的记录,一次只能修改一条!",0);
		return;
	}
	
	var area = ["25%","75%"];
	if(typeof(Obj.width) != "undefined" && typeof(Obj.height) != "undefined"){
		area[0] = Obj.width;
		area[1] = Obj.height;
	}
	
	layer.open({
		type: 2,
		title: Obj.title,
		fixed: false, //不固定
		maxmin: true,
		area: area,
		content: path+Obj.url,
		success: function(layero, index) {
		  if(Obj.full){
			 layer.full(index);
		  }else if(Obj.iframeAuto){
			 //如果最大化的话就没有必要调整窗口大小了
			 layer.iframeAuto(index);
		  }
	    }
	})
}